<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    function Person(name, age) {
        if (!new.target) {
            return new Person(name, age);
        }

        //给Person中的name属性赋值为name形参中的值
        this.name = name;
        this.age = age;
    }
    // Person.prototype.say = function () {
    //     console.log(this.name)
    //     // console.log(this.age);
    // }
    //
    // Person.prototype.move = function () {
    //     console.log("move");
    // }
    //批量添加原型方法
    Person.prototype = {
        say: function () {
            console.log(this.name)
        },
        move: function () {
            console.log("move");
        },
        constructor: Person
    }

    let p1 = new Person("haha", 18);
    let p2 = new Person("张三", 28);
    console.log(p1);
    p1.say();
    p1.move();
    p2.say();
    p2.move();
    /*
    constructor属性不影响任何JavaScript的内部属性。constructor其实没有什么用处，
    只是JavaScript语言设计的历史遗留物。由于constructor属性是可以变更的，所以未必真的指向对象的构造函数，只是一个提示。
    不过，从编程习惯上，我们应该尽量让对象的constructor指向其构造函数，以维持这个惯例。

    可以将对象的构造函数暴露出去
     */
    let ani = (function () {
        function Animal() {
            this.name = "小狗";
        }
        Animal.prototype = {};

        return new Animal();
    })();
    console.log(ani);
    console.log(ani.__proto__);
    console.log(ani.__proto__.constructor);
    ani.__proto__.constructor.prototype.say = function () {
        console.log(this.name);
    }
    ani.say();
    console.log(ani);
</script>
</body>
</html>